﻿/**
	@file	Play_Game.cpp
	@date	2013/1/25
	@author	김진식(jeensig@gmail.com)
	@brief	Playing 게임 구현부
*/
#include "Play_Game.h"
#include "End_Game.h"
#include "Game.h"
#include "FuncClass.h"
#include "Input.h"
#include <Windows.h>
#include <iostream>

PlayingGame::PlayingGame() :
			score_(0)
{
	map_.SetMapFile("map.txt");
}

PlayingGame::~PlayingGame()
{

}

/**
	@brief		초기화
	@remarks	게임 시작을 위한 초기화
*/
void PlayingGame::Init()
{
	system("cls"); ///< 화면 지우기
	map_.LoadMap(); ///< 맵을 불러와 출력
	block_.Init(); ///< 사용할 블럭 초기화
}

/**
	@brief		업데이트
	@remarks	게임이 진행되는 업데이트
*/
void PlayingGame::Update(TetrisGame* owner)
{
	int block_update = block_.Update();

	KeyDown(owner->GetInputProcess());

	switch(block_update)
	{
		case Block::LINECHECK:
			LineCheck(); ///< 블럭이 멈췄을 때 라인이 차있는지 검사
			break;
		case Block::GAMEOVER:
			owner->ChangeState(new EndGame());
			break;
	}
}

/**
	@brief		Key Down
	@remarks	키가 눌렸는지 확인하는 함수
*/
void PlayingGame::KeyDown(InputProcess* input)
{
	if( input->IsKeyDown(VK_LEFT) )
		block_.InputKey(VK_LEFT);

	if( input->IsKeyDown(VK_RIGHT) )
		block_.InputKey(VK_RIGHT);

	if( input->IsKeyDown(VK_UP) )
		block_.InputKey(VK_UP);
}

/**
	@brief		한 줄을 지울 수 있는지 검사 후 지우기
	@remarks	한 줄을 살펴보고 지울 수 있는지 검사 후 지우고 줄을 내린다.
*/
void PlayingGame::LineCheck()
{
	for(int i = 20; i > 0; --i)
	{
		int j;
		for(j = 1; j <= 10; ++j)
		{
			if( FuncClass::GetPositionChar(Position(j, i)) == ' ') 
			{
				break;
			}
		}

		if(j > 10)
		{
			score_ += 10; ///< 점수 증가

			LineDelete(i); ///< 그 줄을 지운다.

			LineDown(i); ///< 그 지운 윗줄부터 하나씩 내린다.

			i++;
		}
	}
}

/**
	@brief		한 줄을 지운다.
	@remarks	인자로 넘어온 위치의 줄을 지운다.
*/
void PlayingGame::LineDelete(int line)
{
	for(int i = 1; i <= 10; ++i)
	{
		FuncClass::DrawTextObject(" ", Position(i, line));
	}
}

/**
	@brief		윗 줄들을 하나 씩 내린다.
	@remarks	지운 줄 위부터 하나씩 다 아래로 내린다.
*/
void PlayingGame::LineDown(int line)
{
	for(int i = line; i > 1; --i)
	{
		for(int j = 1; j <= 10; ++j)
		{
			char dummy = static_cast<char>(FuncClass::GetPositionChar(Position(j, i-1)));
			FuncClass::DrawTextObject(dummy, Position(j, i));
		}
	}
}

/**
	@brief		출력
	@remarks	블럭과 인터페이스를 출력한다.
*/
void PlayingGame::Render()
{
	InterfaceRender();

	block_.Render();
}

/**
	@brief		인터페이스를 출력한다.
	@remarks	오른쪽에 인터페이스를 출력, 현재 점수
*/
void PlayingGame::InterfaceRender()
{
	FuncClass::MoveToCursor(Position(30, 8));
	std::cout << "현재 점수 : " << score_ << std::endl;
}